#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void *thmain1(void *arg);   // 线程1的主函数
void thcleanup1(void *arg);  // 线程清理函数
void thcleanup2(void *arg);  // 线程清理函数
void thcleanup3(void *arg);  // 线程清理函数

int main(int argc, char *argv[])
{
    pthread_t thid1 = 0;

    if (pthread_create(&thid1, NULL, thmain1, NULL) != 0)
    {
        printf("pthread_create failed.\n");
        exit(-1);
    }

    void *ret;
    // 等待子线程退出。
    printf("join...\n");
    pthread_join(thid1, &ret);
    printf("thid1 ret=%ld\n", ret);
    printf("join ok.\n");
}

void *thmain1(void *arg)
{
    pthread_cleanup_push(thcleanup1, NULL);      // 把线程清理函数入栈
    pthread_cleanup_push(thcleanup2, NULL);      // 把线程清理函数入栈
    pthread_cleanup_push(thcleanup3, NULL);      // 把线程清理函数入栈
    for(int i = 0; i < 3; ++i){
        sleep(1);
        printf("pthmain1 sleep(%d) ok.\n", i+1);
    }
    pthread_cleanup_pop(1);                     // 把线程清理函数出栈
    pthread_cleanup_pop(1);                     // 把线程清理函数出栈
    pthread_cleanup_pop(1);                     // 把线程清理函数出栈
    // return (void*)1;
}


void thcleanup1(void *arg){
    // 在这里关闭文件、断开连接、回滚数据库事务、释放锁等
    printf("cleanup1 ok.\n");
}

void thcleanup2(void *arg){
    // 在这里关闭文件、断开连接、回滚数据库事务、释放锁等
    printf("cleanup2 ok.\n");
}

void thcleanup3(void *arg){
    // 在这里关闭文件、断开连接、回滚数据库事务、释放锁等
    printf("cleanup3 ok.\n");
}